package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;

import co.gov.medellin.ssti.sub.model.dao.UsuarioSubprogramaDAO;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.UsuarioSubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class UsuarioSubprogramaDAOImpl2 extends NamedParameterJdbcDaoSupport
		implements UsuarioSubprogramaDAO {

	public Collection<UsuarioSubprogramaVO> findUsuarios(String condicion) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT usu.CODIGO codeusu,usu.NOMBRE nomusu,usu.DESCRIPCION desusu,gusu.DESCRIPCION nomgrupo, gusu.CODIGO codegrupo "
				+ " FROM paoyer.TCS_USUARIO usu, paoyer.TCS_GRUPO_USUARIO gusu "
				+ " WHERE usu.GUS_CODIGO=gusu.CODIGO "
				+ " AND usu.campo_a1 IS NULL and gusu.campo_a1 IS NULL";
		boolean tieneCondicion = false;
		if (condicion != null && condicion.length() > 0
				&& !condicion.equals("null")) {
			tieneCondicion = true;
			query += " AND (usu.NOMBRE LIKE upper(:NOMBRE) OR usu.DESCRIPCION LIKE UPPER(:DESCRIPCION))";
		}

		if (tieneCondicion) {
			namedParameters.put("NOMBRE", "%" + condicion + "%");
			namedParameters.put("DESCRIPCION", "%" + condicion + "%");
		}

		List<UsuarioSubprogramaVO> lUsuarios = getNamedParameterJdbcTemplate()
				.query(query, namedParameters,
						new RowMapper<UsuarioSubprogramaVO>() {

							public UsuarioSubprogramaVO mapRow(ResultSet rs,
									int rowNum) throws SQLException {
								UsuarioSubprogramaVO vo = new UsuarioSubprogramaVO();
								vo.setCodeUsuario(new Long(rs
										.getLong("codeusu")));
								vo.setNombreUsuario(rs.getString("nomusu"));
								vo.setDescripcion(rs.getString("desusu"));
								vo.setCodeGrupo(new Long(rs
										.getString("codegrupo")));
								vo.setNombreGrupo(rs.getString("nomgrupo"));
								return vo;
							}
						});
		return lUsuarios;
	}

	public long findSubprogramaSede(Long codeSubprograma, Long codeSede) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		int retornar = 0;
		String query = "SELECT CODIGO FROM TCS_BEN_SUBPROGRAMA_SEDE "
				+ "WHERE SEDE_CODIGO = :SEDE_CODIGO AND SBPR_CODIGO = :SBPR_CODIGO ";

		namedParameters.put("SEDE_CODIGO", codeSede);
		namedParameters.put("SBPR_CODIGO", codeSubprograma);

		try {
			long codigo = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, Long.class);
			return codigo;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			return retornar;
		}
	}

	public Collection<UsuarioSubprogramaVO> findNombres(Long codeSubprograma,
			Long codeSede, Long codePrograma, Long codeUsuario) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT prog.NOMBRE nomprog, subpro.NOMBRE nomsub, sede.NOMBRE nomsede, usu.NOMBRE nomusu, gus.descripcion descripcion_grupo "
				+ " FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, TCS_BEN_SEDE sede, paoyer.TCS_USUARIO usu, paoyer.TCS_GRUPO_USUARIO gus "
				+ " WHERE prog.CODIGO = :prog.CODIGO AND subpro.CODIGO = :subpro.CODIGO "
				+ " AND sede.CODIGO = :sede.CODIGO AND usu.CODIGO = :usu.CODIGO "
				+ " AND gus.codigo = usu.gus_codigo ";

		namedParameters.put("prog.CODIGO", codePrograma);
		namedParameters.put("subpro.CODIGO", codeSubprograma);
		namedParameters.put("sede.CODIGO", codeSede);
		namedParameters.put("usu.CODIGO", codeUsuario);

		List<UsuarioSubprogramaVO> results = getNamedParameterJdbcTemplate()
				.query(query, namedParameters,
						new RowMapper<UsuarioSubprogramaVO>() {

							public UsuarioSubprogramaVO mapRow(ResultSet rs,
									int rowNum) throws SQLException {
								UsuarioSubprogramaVO vo = new UsuarioSubprogramaVO();
								vo.setNombreprog(rs.getString("nomprog"));
								vo.setNombresubpro(rs.getString("nomsub"));
								vo.setNombresede(rs.getString("nomsede"));
								vo.setNombreUsuario(rs.getString("nomusu"));
								vo.setNombreGrupo(rs
										.getString("descripcion_grupo"));
								return vo;
							}
						});
		return results;
	}

	public boolean isUsuarioValido(Long codeUsuario, Long codeSubprogramaSede) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT CODIGO FROM TCS_BEN_USUARIO_SEDE "
				+ " WHERE USU_CODIGO = :USU_CODIGO AND SPSE_CODIGO = :SPSE_CODIGO ";

		namedParameters.put("USU_CODIGO", codeUsuario);
		namedParameters.put("SPSE_CODIGO", codeSubprogramaSede);

		try {
			String codigo = getNamedParameterJdbcTemplate().queryForObject(
					query, namedParameters, String.class);
			if (codigo != null) {
				return true;
			}
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception

		}
		return false;
	}

	public int insertUsuarioSubprograma(Long codeSubprogramaSede,
			Long codeUsuario) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "INSERT INTO TCS_BEN_USUARIO_SEDE(CODIGO,USU_CODIGO, SPSE_CODIGO) "
				+ " VALUES(SCS_BEN_USE.NEXTVAL, :USU_CODIGO, :SPSE_CODIGO) ";

		namedParameters.put("USU_CODIGO", codeUsuario);
		namedParameters.put("SPSE_CODIGO", codeSubprogramaSede);
		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	public Collection<AreaVO> findSecretaria() {
		String strSql = "SELECT codigo, nombre "
				+ " FROM tcs_ben_area WHERE area_codigo IS NULL ";

		List<AreaVO> secretarias = getNamedParameterJdbcTemplate()
				.getJdbcOperations().query(strSql, new RowMapper<AreaVO>() {

					public AreaVO mapRow(ResultSet rst, int rowNum)
							throws SQLException {
						AreaVO vo = new AreaVO();
						vo.setCode(new Long(rst.getLong("codigo")));
						vo.setNombre(rst.getString("nombre"));
						return vo;
					}
				});
		return secretarias;
	}

	public int insertPermisosReportes(String[] arr) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "INSERT INTO TCS_BEN_SUBPROGRAMA_USUARIO(CODIGO, SBPR_CODIGO, "
				+ " USU_CODIGO, USUARIO_CREA, FECHA_CREA, TERMINAL_CREA, "
				+ " USUARIO_MODIFICA, FECHA_MODIFICA, TERMINAL_MODIFICA) "
				+ " VALUES(SCS_BEN_SUUS.NEXTVAL, :SBPR_CODIGO, :USU_CODIGO, :USUARIO_CREA, TO_DATE(:FECHA_CREA,'dd/mm/rrrr'), :TERMINAL_CREA, :USUARIO_MODIFICA, TO_DATE(:FECHA_MODIFICA,'dd/mm/rrrr'), :TERMINAL_MODIFICA) ";

		long codeSubprograma = new Long(arr[0]);
		long codeUsuario = new Long(arr[1]);
		String usuarioCrea = arr[2];
		String fechaCrea = arr[3];
		String terminalCrea = arr[4];
		String usuarioModifica = arr[5];
		String fechaModifica = arr[6];
		String terminalModifica = arr[7];

		namedParameters.put("SBPR_CODIGO", codeSubprograma);
		namedParameters.put("USU_CODIGO", codeUsuario);
		namedParameters.put("USUARIO_CREA", usuarioCrea);
		namedParameters.put("FECHA_CREA", fechaCrea);
		namedParameters.put("TERMINAL_CREA", terminalCrea);
		namedParameters.put("USUARIO_MODIFICA", usuarioModifica);
		namedParameters.put("FECHA_MODIFICA", fechaModifica);
		namedParameters.put("TERMINAL_MODIFICA", terminalModifica);

		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	public List<UsuarioSubprogramaVO> findPermisosUsuarios(Long codeUsuario,
			Long codeSubprograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT DISTINCT usu.codigo codusu,usu.NOMBRE nomuser, "
				+ " usu.DESCRIPCION descuser, subpro.NOMBRE nomsub, subpro.codigo "
				+ " FROM TCS_BEN_SUBPROGRAMA subpro, paoyer.tcs_usuario usu,TCS_BEN_SUBPROGRAMA_USUARIO subus "
				+ " WHERE subpro.codigo = subus.sbpr_codigo "
				+ " AND usu.CODIGO = subus.USU_CODIGO "
				+ " AND usu.codigo = :usu.codigo AND subpro.codigo = :subpro.codigo ";

		namedParameters.put("usu.codigo", codeUsuario);
		namedParameters.put("subpro.codigo", codeSubprograma);

		List<UsuarioSubprogramaVO> results = getNamedParameterJdbcTemplate()
				.query(strSql, namedParameters,
						new RowMapper<UsuarioSubprogramaVO>() {

							public UsuarioSubprogramaVO mapRow(ResultSet rs,
									int rowNum) throws SQLException {
								UsuarioSubprogramaVO vo = new UsuarioSubprogramaVO();
								vo.setNombreUsuario(rs.getString("nomuser"));
								vo.setDescripcion(rs.getString("descuser"));
								vo.setNombresubpro(rs.getString("nomsub"));
								return vo;
							}
						});
		return results;
	}

	public List<UserVO> findGrupoUsuarios(Long codeUsuario) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT GUS_CODIGO,NOMBRE,DESCRIPCION FROM paoyer.TCS_USUARIO "
				+ " WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", codeUsuario);

		List<UserVO> results = getNamedParameterJdbcTemplate().query(query,
				namedParameters, new RowMapper<UserVO>() {

					public UserVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						UserVO vo = new UserVO();
						vo.setDescription(rs.getString("DESCRIPCION"));
						vo.setName(rs.getString("NOMBRE"));
						vo.setUserGroupCode(new Long(rs.getString("GUS_CODIGO")));
						return vo;
					}
				});
		return results;
	}

	// TODO: revisar si debe manejar la exception
	public String findCodeSubprograma(Long codeSubprogramaSede) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT SBPR_CODIGO "
				+ "FROM TCS_BEN_SUBPROGRAMA_SEDE WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", codeSubprogramaSede);

		String codigoSubprograma = getNamedParameterJdbcTemplate()
				.queryForObject(query, namedParameters, String.class);
		return codigoSubprograma;

	}

	// TODO: revisar si debe manejar la exception
	public Long findCodeSede(Long codeSubprogramaSede) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT SEDE_CODIGO "
				+ "FROM TCS_BEN_SUBPROGRAMA_SEDE WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", codeSubprogramaSede);

		Long codeSede = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, Long.class);
		return codeSede;

	}

	// TODO: revisar si debe manejar la exception
	public Long findCodePrograma(Long codeSubSede) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT sub.PRG_CODIGO codeProg "
				+ "FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_SUBPROGRAMA_SEDE subSede "
				+ "WHERE subSede.CODIGO = :subSede.CODIGO "
				+ "AND subSede.SBPR_CODIGO = sub.CODIGO ";

		namedParameters.put("subSede.CODIGO", codeSubSede);

		Long codePrograma = getNamedParameterJdbcTemplate().queryForObject(
				query, namedParameters, Long.class);
		return codePrograma;
	}

}
